#include <stdlib.h>
#include <stdio.h>
#include <nds.h>
#include <string.h>
#include <xlibrary.h>

// common headers
#include "common.h"

// local headers

#include "extensionlist.h"

#define _is_extl_invalid(extl) (!(extl) || ((extl)->exts && !(extl)->extnum) || (!(extl)->exts && (extl)->extnum))
sEL *EL_alloc() {
	return (sEL *)xcalloc(1, sizeof(sEL));
}

sEL *EL_copy(sEL *extl) {
	if(_is_extl_invalid(extl) || !extl->exts) return EL_alloc();

	sEL *nextl=(sEL *)xmalloc(sizeof(sEL));
	nextl->exts=(char **)xmalloc(extl->extnum*sizeof(char *));
	nextl->extnum=extl->extnum;

	int i;
	for(i=0; i<extl->extnum; i++) nextl->exts[i]=xstrdup(extl->exts[i]);

	return nextl;
}

int EL_concat(sEL *extl, sEL *aextl) {
	if(_is_extl_invalid(extl) || _is_extl_invalid(aextl)) return 1;
	if(!aextl->exts) return 0;

	extl->exts=(char **)xrealloc(extl->exts, sizeof(char *)*(extl->extnum+aextl->extnum));

	int i;
	for(i=extl->extnum; i<(extl->extnum+aextl->extnum); i++) extl->exts[i]=aextl->exts[i-extl->extnum];

	extl->extnum+=aextl->extnum;

	return 0;
}

int EL_concat_copy(sEL *extl, sEL *aextl) {
	if(_is_extl_invalid(extl) || _is_extl_invalid(aextl)) return 1;
	if(!aextl->exts) return 0;

	extl->exts=(char **)xrealloc(extl->exts, sizeof(char *)*(extl->extnum+aextl->extnum));

	int i;
	for(i=extl->extnum; i<(extl->extnum+aextl->extnum); i++) extl->exts[i]=xstrdup(aextl->exts[i-extl->extnum]);

	extl->extnum+=aextl->extnum;

	return 0;
}

int EL_add(sEL *extl, char *add) {
	sEL aextl={
		.exts=&add,
		.extnum=1
	};

	return EL_concat(extl, &aextl);
}

void EL_free(sEL *extl) {
	if(_is_extl_invalid(extl) || !extl->exts) return;

	int i;
	for(i=0; i<extl->extnum; i++) if(extl->exts[i]) xfree(extl->exts[i]);

	xfree(extl->exts);
	extl->exts=NULL;	// almost useless
	xfree(extl);
}
#undef _is_extl_invalid

